﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using SaludOcupacional.Exceptions;
using System.Collections.ObjectModel;
using System.Globalization;
using SaludOcupacional.Model;

namespace SaludOcupacional.DataAccess
{
    public  class UsuarioDataAccess : IDisposable
    {
        private DatabaseManager dbManager;

        public void Dispose()
        {
            dbManager.Dispose();
        }
        public UsuarioDataAccess()
        {
            dbManager = new DatabaseManager();
        } 

        public void CreateUsuario(Usuario usuario)
        {
            if ( usuario == null)
            {
                throw new LoginException("Invalid Input Parameters");
            }


            string sqlSentence = "INSERT INTO [dbo].[Usuario]([login],[password],[privilegio],[nombre],[apellido_materno],[apellido_paterno],[telefono],[direccion], [fecha_nacimiento], [email], [celular], [stado])VALUES ( ";
            sqlSentence += "@Login,@Password,@Privilegio,@Nombre,@apellidoMaterno,@apellidoPaterno, @Telefono, @Direccion, @fechaNacimiento, @Email, @Celular, @Stado )";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;



            dbManager.Command.Parameters.AddWithValue("@Login", usuario.Login);
            dbManager.Command.Parameters.AddWithValue("@Password", usuario.Password);
            dbManager.Command.Parameters.AddWithValue("@Privilegio", usuario.Privilegio);
            dbManager.Command.Parameters.AddWithValue("@Nombre", usuario.Nombre);
            dbManager.Command.Parameters.AddWithValue("@apellidoMaterno", usuario.ApellidoMaterno);
            dbManager.Command.Parameters.AddWithValue("@apellidoPaterno", usuario.ApellidoPaterno);
            dbManager.Command.Parameters.AddWithValue("@Telefono", usuario.Telefono);
            dbManager.Command.Parameters.AddWithValue("@Direccion", usuario.Direccion);
            dbManager.Command.Parameters.AddWithValue("@fechaNacimiento",usuario.FechaNacimiento);
            dbManager.Command.Parameters.AddWithValue("@Email", usuario.Email);
            dbManager.Command.Parameters.AddWithValue("@Celular", usuario.Celular);
            dbManager.Command.Parameters.AddWithValue("@Stado", usuario.Stado);
            try
            {
                int value = dbManager.NonQuery();

                if (value < 1)
                {
                    throw new LoginException("The record wasn't registered");
                }
            }
            catch (Exception e)
            {
                throw new LoginException("Error creating a user" + e.Message, e);
            }
        }

        public Usuario GetUserByUserName(string login)
        {
            if (string.IsNullOrEmpty(login))
                throw new ArgumentNullException("login");

            // Create a Sql sentence
            string sqlsentence = "SELECT * FROM [Usuario] WHERE login = @Login";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("@Login", login);

            Usuario resp = null;

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRow reader = dataSet.Tables[0].Rows[0];

                    resp = new Usuario
                    {
                        CodUsuario = Convert.ToInt32(reader["cod_usuario"], System.Globalization.CultureInfo.InvariantCulture),
                        Login = reader["login"].ToString(),
                        Password = reader["password"].ToString(),
                        Privilegio = reader["privilegio"].ToString(),
                        Nombre = reader["nombre"].ToString(),
                        ApellidoMaterno = reader["apellido_materno"].ToString(),
                        ApellidoPaterno = reader["apellido_paterno"].ToString(),
                        Telefono = Convert.ToInt32(reader["telefono"], System.Globalization.CultureInfo.InvariantCulture),
                        Direccion = reader["direccion"].ToString(),
                        FechaNacimiento = reader["fecha_nacimiento"].ToString(),
                        Email = reader["email"].ToString(),
                        Celular = Convert.ToInt32(reader["celular"], System.Globalization.CultureInfo.InvariantCulture),
                        Stado = reader["stado"].ToString()
                    };
                }
            }
            catch (Exception)
            {
                throw;
            }

            return resp;
        }

        public void EditUser(Usuario usuario)
        {
            if (usuario == null)
            {
                throw new LoginException("The user can´t be null");
            }

            string sqlSentence = "UPDATE [Usuario]  SET [login] = @Login, [privilegio] = @Privilegio, [nombre] = @Nombre, [apellido_materno] = @apellidoMaterno,[apellido_paterno] = @apellidoPaterno, [telefono] = @Telefono, [direccion] = @Direccion, [fecha_nacimiento] = @fechaNacimiento, [email] = @Email, [celular] = @Celular WHERE [cod_usuario] = @codUsuario";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;


            dbManager.Command.Parameters.AddWithValue("@Login", usuario.Login);
            dbManager.Command.Parameters.AddWithValue("@Privilegio", usuario.Privilegio);
            dbManager.Command.Parameters.AddWithValue("@Nombre", usuario.Nombre);
            dbManager.Command.Parameters.AddWithValue("@apellidoMaterno", usuario.ApellidoMaterno);
            dbManager.Command.Parameters.AddWithValue("@apellidoPaterno", usuario.ApellidoPaterno);
            dbManager.Command.Parameters.AddWithValue("@Telefono", usuario.Telefono);
            dbManager.Command.Parameters.AddWithValue("@Direccion", usuario.Direccion);
            dbManager.Command.Parameters.AddWithValue("@fechaNacimiento", usuario.FechaNacimiento);
            dbManager.Command.Parameters.AddWithValue("@Email", usuario.Email);
            dbManager.Command.Parameters.AddWithValue("@Celular", usuario.Celular);
            dbManager.Command.Parameters.AddWithValue("@codUsuario", usuario.CodUsuario);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }
        }

        public void ChangePassword(string login, string newPass)
        {
            if (string.IsNullOrEmpty(login))
                throw new ArgumentNullException("login");
            if (string.IsNullOrEmpty(newPass))
                throw new ArgumentNullException("newPass");

            string sqlSentence = "UPDATE [Usuario]  SET [password] = @Password WHERE [login] = @Login";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;

            dbManager.Command.Parameters.AddWithValue("@Password", newPass);
            dbManager.Command.Parameters.AddWithValue("@Login", login);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }


        }

        public void CambiarEstadoUsuario(string login, string nuevoEstado)
        {
            if (string.IsNullOrEmpty(login))
                throw new ArgumentNullException("login");

            if (string.IsNullOrEmpty(nuevoEstado))
                throw new ArgumentNullException("nuevoEstado");

            string sqlSentence = "UPDATE [Usuario]  SET [stado] = @Stado WHERE [login] = @Login";

            dbManager.Command.CommandText = sqlSentence;
            dbManager.Command.CommandType = System.Data.CommandType.Text;

            dbManager.Command.Parameters.AddWithValue("@Stado", nuevoEstado);
            dbManager.Command.Parameters.AddWithValue("@Login", login);

            try
            {
                int value = dbManager.NonQuery();
                if (value < 1)
                {
                    throw new LoginException("The change wasn't registered");
                }

            }
            catch (Exception e)
            {
                throw new LoginException("Error edit profile", e);
            }

        }

        public Collection<Usuario> BuscarUsuarioPorNombre(string nombre)
        {
            if (string.IsNullOrEmpty(nombre))
                throw new ArgumentNullException("nombre");

            string espa = " ";

            string sqlsentence = "SELECT DISTINCT * FROM [Usuario] WHERE ([nombre]+@espa+[apellido_paterno]+@espa+[apellido_materno] LIKE '%' + @Nombre + '%')";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("@espa", espa);
            dbManager.Command.Parameters.AddWithValue("@Nombre", nombre);

            Collection<Usuario> usuarios = new Collection<Usuario>();

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRowCollection reader = dataSet.Tables[0].Rows;

                    for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                    {

                        usuarios.Add(new Usuario
                                         {
                                             CodUsuario =
                                                 Convert.ToInt32(reader[i]["cod_usuario"], System.Globalization.CultureInfo.InvariantCulture),

                                             Login = reader[i]["login"].ToString(),
                                             Password = reader[i]["password"].ToString(),
                                             Privilegio =
                                                 reader[i]["privilegio"].ToString(),
                                                                 
                                             Nombre = reader[i]["nombre"].ToString(),
                                             ApellidoMaterno = reader[i]["apellido_materno"].ToString(),
                                             ApellidoPaterno = reader[i]["apellido_paterno"].ToString(),
                                             Telefono =
                                                 Convert.ToInt32(reader[i]["telefono"],
                                                                 System.Globalization.CultureInfo.InvariantCulture),
                                             Direccion = reader[i]["direccion"].ToString(),
                                             FechaNacimiento = reader[i]["fecha_nacimiento"].ToString(),
                                             Email = reader[i]["email"].ToString(),
                                             Celular =
                                                 Convert.ToInt32(reader[i]["celular"],
                                                                 System.Globalization.CultureInfo.InvariantCulture),
                                             Stado = reader[i]["stado"].ToString()


                                         });
                    }
                }
            }


            catch (Exception)
            {
                throw;
            }

            return usuarios;

        }

        public Usuario BuscarUsuarioPorLogin(string login)
        {


            // Create a Sql sentence
            string sqlsentence = "SELECT * FROM [Usuario] WHERE login = @Login";

            dbManager.Command.CommandText = sqlsentence;
            dbManager.Command.Parameters.AddWithValue("@Login", login);

            Usuario resp = null;

            try
            {
                DataSet dataSet = dbManager.Query();

                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    DataRow reader = dataSet.Tables[0].Rows[0];

                    resp = new Usuario
                    {
                        CodUsuario =
                                                 Convert.ToInt32(reader["cod_usuario"], System.Globalization.CultureInfo.InvariantCulture),

                        Login = reader["login"].ToString(),
                        Password = reader["password"].ToString(),
                        Privilegio =
                            reader["privilegio"].ToString(),

                        Nombre = reader["nombre"].ToString(),
                        ApellidoMaterno = reader["apellido_materno"].ToString(),
                        ApellidoPaterno = reader["apellido_paterno"].ToString(),
                        Telefono =
                            Convert.ToInt32(reader["telefono"],
                                            System.Globalization.CultureInfo.InvariantCulture),
                        Direccion = reader["direccion"].ToString(),
                        FechaNacimiento = reader["fecha_nacimiento"].ToString(),
                        Email = reader["email"].ToString(),
                        Celular =
                            Convert.ToInt32(reader["celular"],
                                            System.Globalization.CultureInfo.InvariantCulture),
                        Stado = reader["stado"].ToString()

                    };
                }
            }
            catch (Exception)
            {
                throw;
            }

            return resp;
        }

    }

 
}
